package com.solo.system.web;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.mybatisflex.core.paginate.Page;
import com.solo.common.core.global.R;
import com.solo.common.logger.annotation.Logger;
import com.solo.common.logger.enums.LoggerType;
import com.solo.common.orm.core.query.Wrappers;
import com.solo.system.model.i18n.type.SysI18nTypeConvert;
import com.solo.system.model.i18n.type.req.I18nTypeCreateReq;
import com.solo.system.model.i18n.type.req.I18nTypeQueryReq;
import com.solo.system.model.i18n.type.req.I18nTypeUpdateReq;
import com.solo.system.model.i18n.type.req.I18nTypeUpdateStatusReq;
import com.solo.system.model.i18n.type.resp.I18nTypeGetResp;
import com.solo.system.model.i18n.type.resp.I18nTypeListResp;
import com.solo.system.model.i18n.type.resp.I18nTypeListSimpleResp;
import com.solo.system.service.SysI18nTypeService;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

import static com.solo.system.api.entity.table.SysI18nTypeTableDef.SysI18nTypeTable;

/**
 * 国际化语言类型控制器
 * @author 十一
 * @since 2024-10-23 15:10
 * 人生若只如初见，何事秋风悲画扇
 **/
@RestController
@AllArgsConstructor
@RequestMapping("/system/i18n-type")
public class SysI18nTypeController {

    private final SysI18nTypeService sysI18nTypeService;

    /**
     * 新增国际化语言类型
     * @param req 国际化语言类型新增对象
     * @return 响应信息
     */
    @PostMapping
    @SaCheckPermission("system-i18n-type-create")
    @Logger(value = "新增国际化语言类型", type = LoggerType.CREATE)
    public R<Boolean> create(@Valid @RequestBody I18nTypeCreateReq req) {
        return R.success(sysI18nTypeService.create(req));
    }

    /**
     * 删除国际化语言类型
     * @param typeIds 国际化语言类型集合
     * @return 响应信息
     */
    @DeleteMapping("/{typeIds}")
    @SaCheckPermission("system-i18n-type-delete")
    @Logger(value = "删除国际化语言类型", type = LoggerType.DELETE)
    public R<Boolean> delete(@PathVariable Long[] typeIds) {
        return R.success(sysI18nTypeService.delete(Arrays.asList(typeIds)));
    }

    /**
     * 国际化语言类型状态切换
     * @param req 国际化语言类型状态修改对象
     * @return 响应信息
     */
    @PutMapping("/update-status")
    @SaCheckPermission("system-i18n-type-update-status")
    @Logger(value = "国际化语言类型状态切换", type = LoggerType.UPDATE)
    public R<Boolean> updateStatus(@Valid @RequestBody I18nTypeUpdateStatusReq req) {
        return R.success(sysI18nTypeService.updateStatus(req));
    }

    /**
     * 更新国际化语言类型
     * @param req 国际化语言类型更新对象
     * @return 响应信息
     */
    @PutMapping
    @SaCheckPermission("system-i18n-type-update")
    @Logger(value = "更新国际化语言类型", type = LoggerType.UPDATE)
    public R<Boolean> update(@Valid @RequestBody I18nTypeUpdateReq req) {
        return R.success(sysI18nTypeService.update(req));
    }

    /**
     * 获取国际化语言类型
     * @param typeId 国际化语言类型
     * @return 响应信息
     */
    @GetMapping("/{typeId}")
    @SaCheckPermission("system-i18n-type-query")
    public R<I18nTypeGetResp> get(@PathVariable Long typeId) {
        return R.success(SysI18nTypeConvert.INSTANCE.convertGet(sysI18nTypeService.getById(typeId)));
    }

    /**
     * 查询正常状态的国际化语言类型精简信息
     * @return 响应信息
     */
    @GetMapping("/list-simple")
    @SaCheckPermission("system-i18n-type-query")
    public R<List<I18nTypeListSimpleResp>> listSimple() {
        List<I18nTypeListSimpleResp> list = sysI18nTypeService.queryChain()
                .where(SysI18nTypeTable.Status.eq(true))
                .listAs(I18nTypeListSimpleResp.class);
        return R.success(list);
    }

    /**
     * 分页查询国际化语言类型列表
     * @param page 分页对象
     * @param req 国际化语言类型查询对象
     * @return 响应信息
     */
    @GetMapping("/page")
    @SaCheckPermission("system-i18n-type-query")
    public R<Page<I18nTypeListResp>> page(Page<I18nTypeListResp> page, I18nTypeQueryReq req) {
        Page<I18nTypeListResp> list = sysI18nTypeService.pageAs(page, Wrappers.builder(req), I18nTypeListResp.class);
        return R.success(list);
    }

}
